package edu.ustb.mis.dm.model.attributes.interfaces;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 适用于二态变量对象的属性集接口
 * 
 * @author saya
 * @version 0.1 对于二态变量属性集合来说比较特殊 T为被包装的内容，为真正的属性集合类型 E为属性序号类型 X为方法返回类型
 */
public interface BinaryAttributes<K, V> extends Attributes<K, V> {
	/**
	 * 添加index属性
	 */
	boolean add(K index);

	/**
	 * 将Collection<K>中指定属性置为true.
	 */
	boolean addAll(Collection<K> c);

	/**
	 * 将Collection中指定属性置为value。
	 */
	boolean addAll(Collection<K> c, V value);

	/**
	 * 增加 fromIndex（包括）到指定的 toIndex（不包括）范围内的属性。
	 */
	boolean addAll(K fromIndex, K toIndex);

	/**
	 * 增加 fromIndex（包括）到指定的 toIndex（不包括）范围内的属性值为value。
	 */
	boolean addAll(K fromIndex, K toIndex, V value);

	/**
	 * 将K[]中指定属性置为true.
	 */
	boolean addAll(K[] indexs);

	/**
	 * 将K[]中指定属性置为value。
	 */
	boolean addAll(K[] indexs, V value);

	/**
	 * 对此 TwoStateAttributes 和 target 属性取交集
	 */
	void and(BinaryAttributes<K, V> target) throws NullPointerException;

	/**
	 * 清除此 TwoStateAttributes 和 target 中相同的属性
	 */
	void andNot(BinaryAttributes<K, V> target) throws NullPointerException;

	/**
	 * 查看集合是否包含属性
	 * 
	 * @param index
	 * @return
	 */
	boolean contains(K index);

	/**
	 * 查看集合是否包含指定所有属性
	 * 
	 * @param indexs
	 * @return
	 */
	boolean containsAll(Collection<K> c);

	/**
	 * 查看集合是否包含指定所有属性
	 * 
	 * @param indexs
	 * @return
	 */
	boolean containsAll(K[] indexs);

	/**
	 * 将属性集合的某个属性置为相反的值，比如index=2，对属性集来说，如果有2号属性，则删除，如果没有则增加
	 */
	boolean flip(K index);

	/**
	 * 将属性集合中指定的 fromIndex（包括）到指定的 toIndex（不包括）范围内的每个的属性置为相反的值， 比如fromIndex=2，toIndex=5,则对属性集2到4号属性进行有->无，无->有的操作
	 */
	boolean flip(K fromIndex, K toIndex);

	/**
	 * 反转Collection<E>内所有属性
	 * 
	 * @param indexs
	 */
	boolean flipAll(Collection<K> c);

	/**
	 * 反转E[]内所有属性
	 * 
	 * @param indexs
	 */
	boolean flipAll(K[] indexs);

	/**
	 * 返回一个新的 TwoStateAttributes，它由此 TwoStateAttributes 中从 fromIndex（包括）到 toIndex（不包括）范围内的属性组成。
	 */
	BinaryAttributes<K, V> get(K fromIndex, K toIndex) throws IndexOutOfBoundsException, NullPointerException;

	/**
	 * 如果 taget 和 当前属性集合具有相同属性，则返回true
	 */
	boolean intersects(BinaryAttributes<K, V> target);

	/**
	 * 返回 fromIndex 后第一个设置为 false 的位的属性。
	 */
	K nextClearBit(K fromIndex) throws IndexOutOfBoundsException, NullPointerException;

	/**
	 * 返回 fromIndex 第一个设置为 true 的位的属性。 比如fromIndex=4，如果4具有属性4则返回死，如不具有属性4，而气候最小编号属性为7，那么返回7
	 */
	K nextSetBit(K fromIndex) throws IndexOutOfBoundsException, NullPointerException;

	/**
	 * 对此 TwoStateAttributes 和 target 属性取并集
	 */
	void or(BinaryAttributes<K, V> target) throws NullPointerException;

	/**
	 * 清除当前TwoStateAttributes中fromIndex（包括）到指定的 toIndex（不包括）范围内的属性。
	 */
	boolean remove(K fromIndex, K toIndex);

	/**
	 * 删除所有属性
	 */
	boolean removeAll();

	/**
	 * 删除Collection<Integer>内所有属性
	 */
	boolean removeAll(final Collection<Integer> c);

	/**
	 * 删除int[]内所有属性
	 */
	boolean removeAll(final Integer[] indexs);

	/**
	 * 以int[]形式返回TwoStateAttributes中存在的属性
	 */
	int[] toIntArray();

	/**
	 * 以List<Integer>形式返回TwoStateAttributes中存在的属性
	 */
	List<K> toIntList();

	/**
	 * 以Set<Integer>形式返回TwoStateAttributes中存在的属性
	 */
	Set<K> toIntSet();

	/**
	 * 对此 TwoStateAttributes 和 target 取不同属性
	 */
	void xor(BinaryAttributes<K, V> target) throws NullPointerException;
}
